招生考试网
学历| 高考 美术高考 考研 自考 成考 专升本 中考 会考 外语| 四六级 职称英语 商务英语 公共英语 日语能力 翻译资格 JTEST
资格| 公务员 报关员 银行从业 司法 导游 教师资格 报关 财会| 会计证 经济师 会计职称 注册会计 税务师 资产评估 审计师
工程| 一建 二建 造价师 造价员 咨询师 监理师 安全师 医学| 卫生资格 执业医师 执业药师 执业护士 | 教案 论文 文档
IT类| 计算机等级 计算机软考 职称计算机 高校计算机 推荐-国家公务员 事业单位招聘 军校国防生 自主招生 艺术特长生 招飞
 3773考试网 - 计算机等级考试 - 高校计算机 - 正文

计算机二级辅导:增强MIDAS的安全性

来源:fjzsksw.com 2009-11-3 15:59:25

 增强MIDAS的安全性
  大家都知道,使用RemoteDataModule最令人头疼的就是安全性问题。
  主要体现在:
  1、远端只要知道应用服务器的端口号即可访问到应用服务器,而一旦访问到应用服务器,TClientDataSet即可获得ProviderNames列表。(观点:不让他轻易得到ProviderNames列表。)
  2、一旦知道了ProviderNames列表,这就相当于将数据库暴露在外了。
  例如:客户端可以通过SQL语句来对数据库进行操作了。(观点:我们的应用服务器根部不接受SQL语句。)
  因为看到大家此类贴多如牛毛,又没有什么更好的解决方法,因此我发表一下我的拙见。
  我对IAppServer接口进行了进一步的扩展,增强了RemoteDataModule的安全性。主要体现在:
  1、客户端侦测到应用服务器的端口号可以建立与应用服务器的连接,但必须提供由TClientDataSet提供一GUID作为密码方能在设计阶段获得ProviderNames列表。此功能使得系统外部人员无法在设计阶段直接在TClientDataSet的ProviderName中直接获得应用服务器的TProvider实例。如果想通过IAppServer来获取ProviderNames列表则必须提供这一特定的GUID作为密码。
  IAppServer的AS_GetProviderNames原形为
  function AS_GetProviderNames: OleVariant; safecall;
  扩展后的函数为
  function AS_GetProviderNames(Password:WideString): OleVariant; safecall;
  系统外部人员能够访问TRemoteDataModule的Provider的唯一方法就是猜测(或者成为蒙)出可能有的ProviderName直接赋值给TClientDataSet的ProviderName属性。当然这是十分困难的(只要你不是直接将datasetProvider1作为TdatasetProvider的名称)。
  2、虽然恶意者可能通过其他方法(包括猜测、穷举)来获取到一个具有较高权限的TProvider,但是此步的安全特性完全将其挡在了门外。
  TClientDataSet必须提供加密后的CommandText串才能得到应用服务的正确相应。因为这里的加密对象是SQL语句(一个字符串),所以可以使用n多种加密方法。如果应用服务器解密出的串为非法SQL串,会向客户端返回SQL语法错误信息。
  而我在处理时并没有对SQL进行真正的加密,而是在TClientDataSet的CommandText中包含了一特定的字符串作为钥匙,而如果服务器得到请求后在CommandText中没有找到这一钥匙则返回“Missiong SQL property”异常。如果服务器得到了这一钥匙,则将这一钥匙从CommandText串中移除后交给TProvider进行处理。
  实现:
  听上去好像很玄,但实现起来比较简单:
  我这里简单说说对SQL串的加密方法:
  打开Provider单元,找到TDataSetProvider的SetCommandText方法。
  你应该明白了吧。。。
  如果你比我还菜,你就这样写:
  var commandt:string;
  begin
  if CommandText=\’\’ then Exit;
  if Copy(Commandtext,1,8)<>\’minercxy\’ then Exit;
  commandt:=Copy(CommandText,9,length(CommandText)-8);
  if not(poAllowCommandTet in Options) then
  DatabaseError(SCannotChangeCommandText);
  CheckDataSet;
  IProviderSupport(DataSet).PSSetCommandText(CommandT);
  end;
  发布问题,编译Provider单元并将Provider.dcu文件和并入应用服务器目录中,编译应用服务器。这样Tclientdataset必须提供\’minercxy\’+\’select * from ...\’ 这样的命令才能被服务器承认。来源:考的美女编辑们
  我把\’minercxy\’暂且称为钥匙,钥匙可以自己进行随意设置,位数也可随意长度。当然钥匙的随机性越大安全性就越强了。


  • 上一个文章:
  • 网站版权与免责声明
    ①由于各方面情况的不断调整与变化,本网所提供的相关信息请以权威部门公布的正式信息为准.
    ②本网转载的文/图等稿件出于非商业性目的,如转载稿涉及版权及个人隐私等问题,请在两周内邮件fjksw@163.com联系.
    最新文章


    | 关于我们 | 联系我们 | 版权申明 | 网站导航 |
    琼ICP备12003406号